package com.vimhe.easyimport.config;

import com.vimhe.easyimport.config.bean.CellConfig;
import com.vimhe.easyimport.config.bean.Configuration;
import com.vimhe.easyimport.config.bean.FileConfig;
import com.vimhe.easyimport.config.bean.RowConfig;
import com.vimhe.easyimport.config.bean.SheetConfig;
import com.vimhe.easyimport.exception.ImportException;

import java.util.Map;

/**
 * 存储和获取配置信息的对象
 *
 * @author Vimhe
 */
public final class ImportConfig {

    private Configuration configuration;

    public ImportConfig(ConfigSource configSource) {
        if (configSource == null) {
            throw new ImportException("无效的配置源");
        }

        configuration = configSource.read();
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    /**
     * 获取文件配置对象
     *
     * @param name 文件名
     * @return 文件配置对象
     */
    public FileConfig getFileConfig(String name) {
        return getConfiguration().getFileConfigs().get(name);
    }

    /**
     * 获取工作表配置对象
     *
     * @param name       文件名
     * @param sheetIndex 工作表索引
     * @return 工作表配置对象
     */
    public SheetConfig getSheetConfig(final String name, final int sheetIndex) {
        FileConfig fileConfig = getFileConfig(name);
        if (fileConfig == null) {
            return null;
        }

        Map<Integer, SheetConfig> sheetConfigs = fileConfig.getSheetConfigs();
        if (sheetConfigs == null) {
            return null;
        }

        return sheetConfigs.get(sheetIndex);
    }

    /**
     * 获取行配置对象
     *
     * @param name       文件名
     * @param sheetIndex 工作表索引
     * @param rowIndex   行索引
     * @return 行配置对象
     */
    public RowConfig getRowConfig(final String name, final int sheetIndex, final int rowIndex) {
        SheetConfig sheetConfig = getSheetConfig(name, sheetIndex);
        if (sheetConfig == null) {
            return null;
        }

        RowConfig rowConfig = sheetConfig.getRowConfig();
        if (rowConfig == null) {
            return null;
        }

        if (rowConfig.getStart() <= rowIndex && rowConfig.getEnd() >= rowIndex) {
            return rowConfig;
        }

        return null;
    }

    /**
     * 获取单元格配置对象
     *
     * @param name       文件名
     * @param sheetIndex 工作表索引
     * @param rowIndex   行索引
     * @param cellIndex  列索引
     * @return 单元格配置对象
     */
    public CellConfig getCellConfig(final String name, final int sheetIndex, final int rowIndex, final String cellIndex) {
        RowConfig rowConfig = getRowConfig(name, sheetIndex, rowIndex);
        if (rowConfig == null) {
            return null;
        }

        Map<String, CellConfig> cellConfigs = rowConfig.getCellConfigs();
        if (cellConfigs == null) {
            return null;
        }

        return cellConfigs.get(cellIndex);
    }

}
